<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 函数柯里化优点：1、入口单一，易于测试与复用
    //                2、易于定位bug，确定是哪个参数出了问题
    // 缺点：函数嵌套，占用内存，效率低

    // 封装一个函数柯里化的方法(延迟执行)
    // fn是要柯里化的函数
    function curry(fn) {
      // 获取fn的参数个数
      let len = fn.length;
      return function temp() {
        // 储存调用temp时传入的参数
        let args = [...arguments];
        if (args.length >= len) {
          // 拿到所有参数时传入所有参数并执行
          return fn(...args);
        } else {
          // 参数未拿全时返回函数
          return function () {
            // 递归调用直到传递完所有参数，传回上次拿到的参数以及这次传入的参数
            return temp(...args, ...arguments);
          }
        }
      }
    }

    function say(company, department, name) {
      console.log(`我的公司是${company},部门是${department},名字是${name}`);
    }

    let companyApartment = curry(say);

    let personName = companyApartment('华为')('it');
    // 拿到所有参数后才能输出结果
    personName('张三');
    personName('李四');




  </script>
</body>

</html>